﻿using Halcon二次开发.Model.自定义控件;
using Halcon二次开发.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Reflection;
using static System.Windows.Forms.Form;
using static Halcon二次开发.Tools.HelpJsons;
using Halcon二次开发.Model.储放所有单例.储存每个单例界面;
using Halcon二次开发.Tools;
using System.Xml.Linq;
using Halcon二次开发.View.多模板匹配;

namespace Halcon二次开发.Controller.数据加载与保存
{
    //主界面关闭调用 ，存储每个界面的数据
    internal class StorageDataController
    {
        private string path;//存在第一次的路径，后面更改了初始路径
        private string filePath;//初始路径
        public StorageDataController(string path)
        {
            this.path = path;
            this.filePath = path;
        }
        public void Storage(HwindowFlowNodeUrseControl hd)
        {
            //将上一次保存的Json文件进行一个删除操作

            //写入指定的文件
            foreach (TreeNode its in hd.treeView1.Nodes)
            {
                string rrr = hd.projectName;
                path += hd.name + "任务文件\\界面数据\\" + its.Name + "\\" + its.Name + "数据.json";
                Dictionary<string, string> valuePairs = new Dictionary<string, string>();
                Type type = its.Tag.GetType();
                //处理所有窗体中Tag绑定的数据存储
                //特殊情况，有矩形和圆形的窗体  PMA窗体的情况
                FieldInfo[] filds = type.GetFields();
                List<UserControl> node = new List<UserControl>();
                foreach (var item in filds)
                {
                    if (item.Name.Contains("node"))
                    {
                        node.Add((UserControl)item.GetValue(its.Tag));
                    }
                }
                ControlCollection s = (ControlCollection)type.GetProperty("Controls").GetValue(its.Tag);
                //找子控件
                foreach (Control c in s)
                {
                    Next(c, valuePairs, its.Text);
                }
                //特殊处理我们的界面例如：PMA界面有一矩形操作页和圆形操作页
                try
                {
                    if (node.Count > 0)
                    {
                        foreach (var nodes in node)
                        {
                            foreach (Control n2 in nodes.Controls)
                            {
                                if (n2.Tag != null)
                                {
                                    if (n2.Tag.ToString().Length > 0)
                                    {
                                        //if (n2.Tag.ToString().Equals("矩形左右长度"))
                                        //{
                                        //    valuePairs.Add(n2.Tag.ToString(), n2.Text);
                                        //}
                                        //判断字典类中有没有这个字段
                                        if (!valuePairs.ContainsKey(n2.Tag.ToString()))
                                        {
                                            valuePairs.Add(n2.Tag.ToString(), n2.Text);
                                        }
                                    }
                                }
                            }
                        } 
                    }
                }
                catch (Exception e)
                {
                    (FormDb.Db["Form1"] as Form1).textBox1.AppendText("存储圆形数据异常\r\n");
                }
                //将这个字典集合进行存储
                HelpJsons.Write(valuePairs, path);
                path = filePath;
            }
            path = filePath;
        }
        public void Next(Control c, Dictionary<string, string> valuePairs, string addres)
        {
            foreach (Control z in c.Controls)
            {
                if (z.Tag != null)
                {
                    if (z.Tag.ToString().Length > 0)
                    {
                        if (z is NumericUpDown)
                        {
                            valuePairs.Add(z.Tag.ToString(), ((NumericUpDown)z).Value+"");
                        }
                        else
                        {
                            valuePairs.Add(z.Tag.ToString(), z.Text);
                        }
                    }
                }
                Next(z, valuePairs, addres);
            }
        }
    }
}
